/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package simplemetrosystem.model.charlanguage;

import java.util.ArrayList;
import java.util.HashMap;
import simplemetrosystem.model.Exceptions.NameMapException;

/**
 * 界面名称获取类
 * 类使用单例模式,类必须在配置工厂中生成
 * @author Eric Qian
 */
public class NameMap {

    /**
     * 初始化名称图,并得到类的实例
     * 警告：该类只应该在配置管理器中进行初始化
     * @return NameMap实例
     */
    public static NameMap newInstance() {
        nameMap = new NameMap();
        return nameMap;
    }

    /**
     * 得到NameMap实例，若NameMap未初始化，返回NUll
     * @return
     */
    public static NameMap getInstance() {
        if (nameMap != null) {
            return nameMap;
        } else {
            System.out.println("NameMap: null");
            return null;
        }
    }

    /**
     * 构造函数
     */
    private NameMap() {
        currentLanguage = ENGLISH;
        currentName = new Language("");
        languages = new ArrayList<String>();
        languages.add(ENGLISH);
        map = new HashMap<String, Language>();
    }

    /**
     * 新增语言language,若语言不存在则初始化该语言
     * @param language 新语言名称
     */
    public void addLanguage(String language) {
        if (!languages.contains(language)) {
            languages.add(language);
        }
    }

    /**
     * 设置当前语言
     * @param language 语言名
     * @throws NameMapException 若语言名不存在抛出异常 
     */
    public void setLanguage(String language) throws NameMapException {
        if (languages.contains(language)) {
            currentLanguage = language;
        } else {
            throw new NameMapException("Set Language; no Language");
        }
    }

    /**
     * 得到当前元素显示名的语言,如为中文返回false，为其他语言返回true
     * @return
     */
    public boolean getDisployLanguage() {
        if (currentLanguage.equals(CHINESE)) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 增加一个语言关联
     * @param nameA 英语名称
     * @param nameB 关联语言名称
     * @param language 关联语言
     * @throws simplemetrosystem.model.Exceptions.NameMapException 若不存在该关联语言，抛出异常
     * 
     */
    public void addName(String nameA, String nameB, String language) throws NameMapException {
        //System.out.println(nameA+nameB+language);
        if (languages.contains(language)) {
            if (currentName.getIndex().equals(nameA)) {
                currentName.addName(nameB, language);
            } else {
                currentName = new Language(nameA);
                currentName.addName(nameB, language);
                map.put(nameA, currentName);
            }
        } else {
            throw new NameMapException("Add Name:no language");
        }
    }

    /**
     * 得到当前语言名称
     * @param name
     * @return
     */
    public String getName(String name) {
        if (map.containsKey(name)) {
            return map.get(name).getName(currentLanguage);
        } else {
            System.out.println("NameMap Error: Name " + name);
            return name;
        }
    }

    public int getLangagesSize() {
        return languages.size();
    }

    public String getLanguageAt(int i) {
        return languages.get(i);
    }
    private static NameMap nameMap;
    private String currentLanguage;
    private Language currentName;
    private ArrayList<String> languages;
    private HashMap<String, Language> map;
    /**
     * 英文标签名
     */
    public static String ENGLISH = "english";
    /**
     * 中文标签名
     */
    public static String CHINESE = "chinese";
}
